
// Wait for Apache Cordova to load
document.addEventListener("deviceready", onDeviceReady, false);

// PhoneGap is ready
function onDeviceReady() {
	//navigator.splashscreen.hide();

}
// Esta es el javascript principal, este es el que concentra las llamadas de toda la aplicación, define en un principio todas las
// variables que se usarán a lo largo del programa

var indexApp = function(){}

indexApp.prototype = function() {
	
	// Variables para el control de la aplicación
    var categoryForDetails=null,
    _productForDetails=null,
    _productOriginal=null,
	orden = {idOrden:234, fechaCreacion:'no se',
		items:[{productOrderId:324, nombre:'empanaditas', id:2, impreso:true, idUsuario:"mi@correo",
			tamanios:[{descripcion:'Ch.', precio:10, cantidad:1}, {descripcion:'Gd.', precio:30, cantidad:2}],
			variaciones:[{id:2, descripcion:"var1", precio:11, selected:true}], 
			ingredientes:[{id:1, descripcion:'Sal', selected:true}, {id:2, descripcion:'Cebolla', selected:true}]}
			]},
	
	nuevoPedido = 
	
	[{nombre:'empanaditas123', id:'p123-0', impreso:false, idUsuario:"mi@correo",
			tamanios:[{descripcion:'Ch.', precio:10, cantidad:1}, {descripcion:'Gd.', precio:30, cantidad:2}],
			variaciones:[{id:1, descripcion:"var1", precio:11, selected:true}, {id:2, descripcion:"var2", precio:11, selected:false}],
			ingredientes:[{id:1, descripcion:'Sal', selected:true}, {id:2, descripcion:'Cebolla', selected:true}]}
			],
		
	_precioOrden=0.0,
	_ordenToSend= null,
    categories=null,
    mesaSelect=null,
    products=null,
    userData = {idUsuario:'mi@correo', idRestaurante:123},
    login = true,
    llave = null;
    
    // run Método que se ejecuta en un inicio, sirve para definir los eventos de la aplicación.
    // Con este método agrego los eventos de onclick a las lista, botones etc
    // El otro lugar donde se puede definir el control de la app es en el href de los anchors (botones y listas) que pueden
    // ser creados directamente en html o en la creación de las listas en un js
    run = function(){
        var that = this;
        localStorage.clear();
        // Cata uno de estos ejectua el método ligado en el momento en que el evento (pagebegforecreate) se activa
        $('#homePage').one('pagebeforecreate',$.proxy(_initPage,that));        
        $('#homePage').one('pagebeforecreate',$.proxy(_loadPanel,that));
        $('#categoriesPage').on('pagebeforeshow',$.proxy(categoriesapp.initCategories,that));
        $('#asignarMesaPage').on('pagebeforeshow',$.proxy(llaveapp.initAsignarLlavePage,that));
        $('#mesasActivasPage').on('pagebeforeshow',$.proxy(mesasactivas.initMesasActivasPage,that));
		
        $("#homePage").bind("swiperight", function(event,ui){$("#menuButton").click();});
        
        // Función que se ejecuta cuando das click en la categoria
        $('#listBottonCategories').on('click', 'a', function () {
        	var item = $(this);
        	// Cuando se crea el listado de categorias en categoriesapp.initCategories, se añade el objeto de cada categoria 
        	// al item.data con el nombre category
			categoryForDetails = item.data('category');
			// Manda a llamar el js de categoriesApp y el método de showProductsByCategory con la categoría seleccionada
			// categoryForDetails es el json de categoria dentro del listado
			categoriesapp.showProductsByCategory(categoryForDetails);
        });
        
        // Función que se ejecuta cuando selecciona un producto
        $('#listBottonProducts').on('click', 'a', function () {
        	var item = $(this);
			_productForDetails = $.extend(true, {}, item.data('product'));
			_productOriginal = item.data('product');
			categoriesapp.showProductDetail(_productForDetails, mesaSelect);
        });
        
        // Función que se ejecuta cuando se asigna una mesa, recupera la información del formato y la manda a sData
        $('#asignarMesaButton').on('click', function () {
			var datosMesa = $('#asignarMesaForm').serialize();
			datosMesa += '&idUsuario=' + index.userData.idUsuario + '&idRestaurante=' + index.userData.idRestaurante
			sData.generateKeyMesa(datosMesa, _handleLlaveGenerator);
			$('#asignarMesaForm')[0].reset();
        });
        
        // Función que se ejecuta cuando seleccionass una mesa activa
        $("#mesasActivasList").on('click', 'a' ,function () {
        	var item = $(this);
			mesaSelect = item.data('mesaActiva');
			// Las ordenes y los nuevos pedidos se vacian 
			orden = {};
			nuevoPedido = [];
			// Estos objetos se llenan con la información que la ordenapp diga, internamente ordenapp manda a llamar el servicio
			ordenapp.showOrdenPage(mesaSelect);
			ordenapp.showNuevosProductos(userData, nuevoPedido);
        });
        
        // Producto actuales ya impresos NO HACE NADA
        $('#productsListOrdenActual').on('click', 'a', function () {
			/*
			var item = $(this);
			
			_productForDetails = $.extend(true, {}, item.data('product'));
			_productOriginal = item.data('product');
			ordenapp.showProductOrdenDetail(_productForDetails);
			$("#productOrdenDetailPage .ui-content").trigger( "refresh" );
			*/
        });
        
        // Función que muesta el detalle de un producto cuando se selecciona un producto de la lista de nuevosProductos
        // LA LÓGICA DEL MOSTRADO DE UN PRODUCTO YA AÑADIDO LOS TIENE LA ORDENAPP
        $("#productsListOrdenNuevo").on('click', 'a' ,function () {
        	var item = $(this);
			_productForDetails = $.extend(true, {}, item.data('product'));
			_productOriginal = item.data('product');
			ordenapp.showProductOrdenDetail(_productForDetails);
			$("#productOrdenDetailPage .ui-content").trigger( "refresh" );
        });
        
        // Boton que se encuentra en la pantalla del detalle del producto
        // Función que agrega un platillo a la lista de nuevosProductos
        $("#agregarPlatillo").on('click', function () {
			// Verifica si existe almenos un tamaño con un 1 o más para añadir
			if(_verificarAddPlatillo('')){
				if(mesaSelect == null){
						console.log("Mesa no seleccionada");
					}else{
						console.log("Mesa seleccionada:" + mesaSelect.idMesa);
						// LO IMPORTANTE ES EL STRING VACIO QUE SE MANDA ESE STRING VACIO ME DICE QUE DONDE VA A BUSCA LA
						// INFORMACIÓN ES EN LA PAGINA DE AGREGAR NUEVO PRODUCTO EN CATEGORIES.JS 
						// CUANDO EL STR VIENE "-ord" QUE ABAJO LO USO ES QUE BUSCA EN LA PAGINA DE EDICIÓN DE PRODUCTOS
						
						_agregarPlatillo('');
						ordenapp.showNuevosProductos(userData, nuevoPedido);
						$.mobile.changePage('#productsOrdenPage', { transition: 'flip' });
				}
			}else{
				console.log("no hay producto");
			}
        });
        
        // Función que se ejcuta cuando se agregan los nuevos productos a la orden y se manda a imprimir
        $("#addToOrdenPrint").on('click', function () {
			console.log("anadir a order");
        	var item = $(this);
        	var toSend = {};
        	$.extend(true, toSend, mesaSelect);
        	$.extend(true, toSend, userData);
        	toSend["items"] = JSON.stringify(nuevoPedido);
        	// sData es smartData.js y es el responsable de conectarse al servidor y mandar el request
        	sData.addProductsToOrden(toSend, _refreshWindow);
			
        });
        
        // Función que manda el servicio de cierre de orden
        $("#closeOrderButton").on('click', function () {
			console.log("close order" + userData.idUsuario + ' ' + orden.idOrder);
			var toSend = {};
        	$.extend(true, toSend, mesaSelect);
        	$.extend(true, toSend, userData);
        	sData.closeOrder(toSend, _updateOrdenPage);
        });
        
        // Función que manda el servicio de paga la cuenta
        $("#pagarCuentaButton").on('click', function () {
			console.log("pagar cuenta" + userData.idUsuario + ' ' + orden.idOrder);
			var tipoPago = $("#tipoPagoList").val();
			var propina = $("#propina").val();
			var toSend = {'tipoPago':tipoPago, 'propina':propina};
        	$.extend(true, toSend, mesaSelect);
        	$.extend(true, toSend, userData);
        	sData.pagarOrder(toSend, _afterPayOrder);
        });
        
        $("#abrirCajaButton").on('click', function () {
			console.log("abrirCaja");
			var montoInicial = $("#montoInicial").val();
			var toSend = {efectivoInicial:montoInicial};
			$.extend(true, toSend, userData);
        	sData.abrirCaja(toSend, _afterAbrirCaja);
        });
        
        $("#cerrarCajaButton").on('click', function () {
			console.log("cerrarCaja");
        	sData.cerrarCaja(userData, _afterCerrarCaja);
        });
        
        // Función que se ejecuta cuando se edita un producto de la lista de nuevosPedido
        $("#editarPlatilloButton").on('click', function () {
			console.log("editarplatillo" + userData.idUsuario + ' ' + orden.idOrder);
			console.log(_productForDetails.item  + ' ')
			// Verifica si existe un tamanio con almenos 1 producto
			if(_verificarAddPlatillo('-ord')){
				if(mesaSelect == null){
						console.log("Mesa no seleccionada");
					}else{
						console.log("Mesa seleccionada:" + mesaSelect.idMesa);
						// en este momento item es un número asignado temporal que no llega al servido (o al menos no se usa)
						// que sirve para que la app sepa cual item de la lista de nuevoPedido es el que se estaba modificando
						// una vez que se aceptan los cambios o se borra dicho producto yo lo saco del listado
						
						// Quita el elemento item de la lista de nuevo pedido
						nuevoPedido = jQuery.grep(nuevoPedido, function(value) {
						return value.item != _productForDetails.item;
						});
						
						// Como es edicio lo vuelvo a insertar pero con la modifiación realizada por el usuario
						// 'ord' me ayuda a buscar los ids que terminan con eso y se que es la pagina de edición
						_agregarPlatillo('-ord');

						ordenapp.showNuevosProductos(userData, nuevoPedido);
						$.mobile.changePage('#productsOrdenPage', { transition: 'flip' });
				}
			}else{
				console.log("no hay producto");
			}
        });
        
        // Función que borrar un platillo 
        $("#borrarPlatilloButton").on('click', function () {
			console.log("borrarplatillo" + userData.idUsuario + ' ' + orden.idOrder);
			console.log(_productForDetails.item  + ' ')
			// Aqui solo quito el platillo de la lista de nuevoPedido, item lo descrivo en la función de arriba
				nuevoPedido = jQuery.grep(nuevoPedido, function(value) {
				  return value.item != _productForDetails.item;
				});
			ordenapp.showNuevosProductos(userData, nuevoPedido);
        });
        
        

    },
    
        // METODOS
    
    _updateOrdenPage = function(){
		ordenapp.updateButtonsOrden(2);
		$.mobile.changePage('#productsOrdenPage', { transition: 'flip' });
	},
	
	_afterPayOrder = function(){
		$.mobile.changePage('#mesasActivasPage', { transition: 'flip' });
	},
	
	_afterAbrirCaja = function(data, success){
		console.log("_afterAbrirCaja " + success);
		if(success){
			$.mobile.changePage('#homePage', { transition: 'flip' });
			//$("#popupBasicAbrirCaja").popup("open");
		}
	},
	
	_afterCerrarCaja = function(data, success){
		console.log("_afterCerrarCaja");
		if(success){
			$.mobile.changePage('#homePage', { transition: 'flip' });
			//$("#popupBasicCerrarCaja").popup("open");
		}
	},
    
    _refreshWindow = function(){
		console.log("refreshWindow")
		nuevoPedido = [];
		ordenapp.showNuevosProductos(userData, nuevoPedido);
		ordenapp.showOrdenPage(mesaSelect);
	},
    
    // Load panel
    _loadPanel = function(){
		// Lee el archivo del menu de la izquierda y genera dicha funcionalidad
		$.get('views/panel.html', function(data) {
			res = data.replace("nombreUsuarioPanel", userData.idUsuario )
			$.mobile.pageContainer.prepend(res);
			//$( "#defaultpanel" ).trigger( "updatelayout" );
			$("#defaultpanel").panel({
			  create: function( event, ui ) {
					$("#defaultpanel").on('click', 'a', function(e) {
						console.log(e.target.id);
						if(e.target.id === 'toAbrirCajaPage'){
							admonCaja.initAdmonPage(true);
						}else if (e.target.id === 'toCerrarCajaPage'){
							admonCaja.initAdmonPage(false);
						}else{
						}
					   
					});
				}
			}).enhanceWithin();
			
		});
	},
	
	// init page
    _initPage = function(){
		localStorage.setItem("idRestaurante", 123);
		var deviceType = (navigator.userAgent.match(/iPad/i))  == "iPad" ? "iPad" : (navigator.userAgent.match(/iPhone/i))  == "iPhone" ? "iPhone" : (navigator.userAgent.match(/Android/i)) == "Android" ? "Android" : (navigator.userAgent.match(/BlackBerry/i)) == "BlackBerry" ? "BlackBerry" : "null";

		if ((navigator.userAgent.match(/iPad/i))  == "iPad" || (navigator.userAgent.match(/iPhone/i))  == "iPhone"  ) {
			$("[id^=headerPlus]").height(10);
		}
		_updateFooter();
		
		// Si no esta logeado te manda a la pagina de login
		if (!login) {
	    	$.mobile.changePage("#logonPage", { transition: "flip" });
	    	$( "#entrarButton" ).click(function() {
				loginapp.login();
			});
			jso_registerRedirectHandler(function(url) {
				inAppBrowserRef = window.open(url, "_blank");
				inAppBrowserRef.addEventListener('loadstop', function(e){LocationChange(e.url)}, false);
			});
	    } 
	},
	
	// Verifica si se puede agregar un platillo
	//strOrd me ayuda a buscar select-native-ord con la descripcion del tamaño para saber que es la pagina de edición de productos
	// y no la de adición de productos
	_verificarAddPlatillo = function(strOrd){
		for(var j in _productForDetails.tamanios){
			sizeItem = _productForDetails.tamanios[j];
			$sizeCur = $('#select-native' +strOrd+ sizeItem.descripcion);
			if($sizeCur.val() > 0){
				return true;
			}
		}
		return false;
	}
	
	
	// Agregar el platillo a la orden y actualizar el precio de orden	
	// strOrd me ayuda a buscar si es la pagina de EDICION o ADICION de productos
	_agregarPlatillo = function(strOrd){
		// Copiar datos de ingredientes
		console.log("Agregar a platillo");
		for(var i in _productForDetails.ingredientes){
			ingredienteItem = _productForDetails.ingredientes[i];
			$ingredienteCur = $('#checkbox-ing'+strOrd+ ingredienteItem.descripcion);
			console.log('ingrediente' + ingredienteItem.descripcion + '  ' + $ingredienteCur.is(':checked'))
			ingredienteItem.selected = $ingredienteCur.is(':checked');
		}
		
		// Copiar datos de las variacion
		for(var k in _productForDetails.variaciones){
			variacionItem = _productForDetails.variaciones[k];
			$variacionCur = $('#radio-var'+strOrd+ variacionItem.descripcion);
			variacionItem.selected = $variacionCur.is(':checked');
		}
		
		// Copiar número de ordenes por tamaño
		for(var j in _productForDetails.tamanios){
			sizeItem = _productForDetails.tamanios[j];
			$sizeCur = $('#select-native'+strOrd + sizeItem.descripcion);
			sizeItem.cantidad = $sizeCur.val();
			console.log("tamanios " +j + " "+sizeItem.descripcion  +  $sizeCur.val());
		}
		_productForDetails['idUsuario'] = userData.idUsuario;
		console.log("tamanio de  nuevoPedido" + nuevoPedido.length);
		nuevoPedido.push($.extend(true, {item:nuevoPedido.length}, _productForDetails));
		
		_updateFooter();
	},
	
	_quitarPlatillo = function(){
		//alert('quitar');
	},
	
	_updateFooter = function(){
		var infoFooter = '<table width="100%"><tr><td width="33%" align="left"><a href="#" class="ui-btn ui-corner-all ui-icon-carat-l ui-btn-icon-left" data-rel="back">Atrás</a></td><td width="33%"><img src="img/logo/logo.png" ></td><td width="33%"></td></tr></table>';
		$("[id^=myFooter]").empty().append(infoFooter);
	};
	
    return {
        run:run,
        userData:userData,
        login:login,
        categories:categories,
        categoryForDetails:categoryForDetails,
        products:products,
        llave:llave,
        mesaSelect:mesaSelect,
        nuevoPedido:nuevoPedido
    };
}();
